package com.codeZ.SingletonPattern;

/**
 * @Author code_zhang
 * @Date 2024/6/15 16:04
 * 单例模式 - 懒汉式(线程安全) 双重校验
 * 优点: 延迟加载, 减少内存开销 线程安全 锁的粒度变小
 * 缺点: 性能比较低
 */
public class SingletonPattern04 {

    // 1. 私有构造方法
    private SingletonPattern04() {
        System.out.println("懒汉式(线程安全)");
    }

    // 2. 静态方法获取实例
    // volatile作用: 防止指令重排序 保证可见性
    private static volatile SingletonPattern04 instance;

    /**
     * 线程 A 检查 instance 是否为 null（此时确实为 null）。
     * 线程 A 被挂起，尚未进入 synchronized 块。
     * 线程 B 进入并执行 synchronized 块，创建并初始化 instance。
     * 线程 B 退出 synchronized 块，此时 instance 不再为 null，但线程 B 的写操作对线程 A 来说可能尚未可见（因为 instance 不是 volatile）。
     * 线程 A 醒来并再次检查 instance（由于它之前检查的结果是 null 并且没有使用 volatile 关键字，它可能仍然看到 instance 为 null）。
     * 线程 A 进入 synchronized 块并再次创建 instance 的一个新实例（这是不希望的）。
     */
    public static SingletonPattern04 getInstance() {
        if (instance == null) {
            synchronized (SingletonPattern04.class) {
                if (instance == null) {
                    // 1. 分配内存空间
                    //2. 初始化对象
                    //3. 将instance指向刚分配的内存空间
                    instance = new SingletonPattern04();
                }
            }
        }
        return instance;
    }


}